package code17_reflect;

import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

// 标注在注解上
/*
 * Target的value属性的取值:
 * TYPE 类、接口、枚举等类型
 * FIELD 属性
 * METHOD 方法
 * PARAMETER 参数
 * CONSTRUCTOR 构造方法
 */
// 如果属性类型是数组，但设置的值只有一个元素时, 可以省略 {}
//@Target(value = ElementType.TYPE)

// 如果只有 value属性需要设置值, 可以省略 value = 
//@Target(ElementType.TYPE)

@Target(value = { ElementType.TYPE, ElementType.FIELD })
/*
 * Retention的value属性的取值:
 * SOURCE, CLASS, RUNTIME(常用)
 */
@Retention(value = RetentionPolicy.RUNTIME)
@Inherited
public @interface MyAnn01 {
	// 类似接口, 但可以创建对象
	
	// 只能定义抽象方法, 注解内的抽象方法, 一般被称为 注解的属性
	// 属性名就是方法名, 方法的返回值类型就是 属性的类型, 所以必须要有返回值
	String value();// 优先使用 value作为名称
	
	// 抽象方法: 
	//   不能有参数, 不能抛出异常, 
	//   必须要有返回值类型, 类型只能是 基本数据类型、String、Class、注解类型、枚举或以上类型的一维数组
	//Stu fun();
	
	// 设置属性的默认值: default 后加上 默认值, 默认值必须符合属性的类型
	int age() default 22;
	// 设置数组的默认值, 此处默认为 一个空的 数组
	Class<?>[] cArr() default {};
}
